//package com.game.timer;
//
//
//import java.util.Iterator;
//import java.util.List;
//import java.util.concurrent.ArrayBlockingQueue;
//import java.util.concurrent.CopyOnWriteArrayList;
//import java.util.concurrent.ExecutorService;
//import java.util.concurrent.ThreadPoolExecutor;
//import java.util.concurrent.TimeUnit;
//import org.alan.mars.executor.MarsWorkExecutor;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.factory.annotation.Autowired;
//
//public class TimerCenter extends Thread {
//    private Logger log = LoggerFactory.getLogger(getClass());
//
//    private List<TimerEvent> array = new CopyOnWriteArrayList<>();
//
//    volatile boolean active;
//
//    private int runTime = 10;
//
//    private int collateInterval = 60000;
//
////    private long lastCollateTime = 0L;
//
//    private ThreadPoolExecutor timerService;
//
//    private SchedulerCenter schedulerCenter;
//
//    @Autowired(required = false)
//    private MarsWorkExecutor workExecutor;
//
//    public TimerCenter(String timerName) {
//        super(timerName);
//    }
//
//    private void begin() {
//        this.active = true;
//        this
//                .timerService = new ThreadPoolExecutor(1, Runtime.getRuntime().availableProcessors() + 1, 10L, TimeUnit.SECONDS, new ArrayBlockingQueue<>(8), new ThreadPoolExecutor.CallerRunsPolicy());
//        this.schedulerCenter = new SchedulerCenter();
//    }
//
//    public SchedulerCenter schedulerCenter() {
//        return this.schedulerCenter;
//    }
//
//    public boolean contain(TimerEvent e) {
//        return this.array.contains(e);
//    }
//
//    public List<TimerEvent> getArray() {
//        return this.array;
//    }
//
//    public ExecutorService getTimerService() {
//        return this.timerService;
//    }
//
//    public void setArray(List<TimerEvent> array) {
//        this.array = array;
//    }
//
//    public void setTimerService(ThreadPoolExecutor timerService) {
//        this.timerService = timerService;
//    }
//
//    public TimerEvent get(TimerListener listener, Object parameter) {
//        for (TimerEvent ev : this.array) {
//            if (listener != ev.getTimerListener())
//                continue;
//            if (parameter == null || parameter.equals(ev.getParameter()))
//                return ev;
//        }
//        return null;
//    }
//
//    public void add(TimerEvent e) {
//        if (this.array.contains(e))
//            this.array.remove(e);
//        e.init();
//        this.array.add(e);
//    }
//
//    public void remove(TimerEvent e) {
//        if (e != null)
//            this.array.remove(e);
//    }
//
//    public void remove(TimerListener listener) {
//        remove(listener, null);
//    }
//
//    public void remove(TimerListener listener, Object parameter) {
//        for (TimerEvent ev : this.array) {
//            if (listener != ev.getTimerListener())
//                continue;
//            if (parameter == null || parameter.equals(ev.getParameter()))
//                this.array.remove(ev);
//        }
//    }
//
//    public void run() {
//        begin();
//        while (this.active) {
//            try {
//                long currentTime = System.currentTimeMillis();
//                fire(currentTime);
//                if (currentTime - this.lastCollateTime > this.collateInterval) {
//                    collate();
//                    this.lastCollateTime = currentTime;
//                }
//                sleep(this.runTime);
//            } catch (Exception e) {
//                this.log.warn("", e);
//            }
//        }
//    }
//
//    public void fire(long time) {
//        for (Iterator<TimerEvent> iter = this.array.iterator(); iter.hasNext(); ) {
//            TimerEvent ev = iter.next();
//            if (ev == null || ev.count <= 0 || !ev.getEnabled()) {
//                this.array.remove(ev);
//                continue;
//            }
//            if (ev.inFire || this.timerService.getQueue().contains(ev))
//                continue;
//            if (time >= ev.nextTime) {
//                ev.inFire = true;
//                if (this.workExecutor != null && ev.workId > 0) {
//                    this.workExecutor.submit(ev.workId, ev);
//                    continue;
//                }
//                this.timerService.execute(ev);
//            }
//        }
//    }
//
//    public void collate() {
//        int queueSize = this.timerService.getQueue().size();
//        int poolSize = this.timerService.getPoolSize();
//        int largestPoolSize = this.timerService.getLargestPoolSize();
//        int maxPoolSize = this.timerService.getMaximumPoolSize();
//        this.log.info("collate millis thread pool,queueSize=" + queueSize + ",poolSize=" + poolSize + ",largestPoolSize=" + largestPoolSize + ",maxPoolSize=" + maxPoolSize);
//    }
//
//    public void close() {
//        this.active = false;
//        clear();
//        this.timerService.shutdown();
//    }
//
//    public void clear() {
//        this.array.clear();
//    }
